/* 
 * File:   Lista_Aluno.c
 * Author: Vagner Clementino
 *
 * Created on 7 de Abril de 2012, 09:40
 */
#include <stdlib.h>
#include <stdio.h>
#include "Lista_Aluno.h"

Lista_Aluno cria_lista_aluno(){
    Lista_Aluno l = NULL;
    l = (Lista_Aluno) malloc(sizeof(Head));
    if( l == NULL){
        /*Erro ao alocar memoria para a Lista*/
        printf("Erro na alocação de memoria para a Lista.\n");
        exit(-8);
    }else{
        l->num_itens = 0;
        l->primeiro = NULL;
        l->ultimo = l->primeiro;
        return l;
    }    
}

void insere_aluno(Lista_Aluno* l, Aluno* p){
    
    pNodo aux = NULL;
    
    if(esta_vazia(*l)){
        /*Lista Vazia*/
        (*l)->primeiro = cria_nodo();
        (*l)->primeiro->a = *p;
        (*l)->ultimo = (*l)->primeiro;
        (*l)->num_itens = 1;        
    }else{
        aux = cria_nodo();
        aux->a = *p;
        (*l)->ultimo->next = (struct Nodo_Aluno*) aux;
        (*l)->ultimo = aux;
        ((*l)->num_itens)++;
    }
}

pNodo cria_nodo(){
    pNodo nodo = NULL;
    nodo = (pNodo) malloc(sizeof(Nodo_Aluno));
    if(nodo == NULL){
        printf("Erro ao alocar memoria para um nodo da lista\n");
        exit(-15);
    }
    else{
        nodo->next=NULL;
        return nodo;
    }
    return NULL;
}

void imprime_lista_aluno(const Lista_Aluno l){
    
    Nodo_Aluno* aux;
    
    if(esta_vazia(l)){
        printf("Lista vazia.\n");
        return;
    }else{
        printf("****Lista****\n");
        printf("Tamanho da lista: %d\n",l->num_itens);
        aux = l->primeiro;
        while(aux != NULL){
            imprime_aluno(&(aux->a));
            aux = (Nodo_Aluno*) aux->next;
        } 
    }      
}

Aluno* busca_aluno(int id_pessoa, const Lista_Aluno l){
    Nodo_Aluno* aux;
    if(esta_vazia(l)){
        return NULL;
    }else{
        aux = l->primeiro;
        while(aux != NULL){
            if(aux->a.id == id_pessoa){
                return (&(aux->a));
            }else{
                aux = (Nodo_Aluno*) aux->next;
            }            
        }
    }
    return NULL;    
}

int esta_vazia(const Lista_Aluno l){
    return (l == NULL || l->num_itens == 0);
}

void remove_todos_alunos(Lista_Aluno* l){
    
    Nodo_Aluno* aux = NULL;
        
   if(esta_vazia(*l)){
        free((*l));
        
    }else{
        
        
        while((*l)->primeiro != NULL){
           aux = (*l)->primeiro;
           (*l)->primeiro = (Nodo_Aluno*) aux->next;
           free(aux);
           (*l)->num_itens--;
        }
       
    }
}